package com.cuijq.ms.singleton.generator;

import java.util.concurrent.atomic.AtomicLong;

/**
 * @Classname IdGenerator5
 * @Description 集群唯一 具体来说，我们需要把这个单例对象序列化并存储到外部共享存储区（比如文件）。 进程在使用这个单例对象的时候，需要先从外部共享存储区中将它读取到内存，并反序列化成对象，然后再使用，
 * 使用完成之后还需要再存储回外部共享存储区。 为了保证任何时刻，在进程间都只有一份对象存在，一个进程在获取到对象之后， 需要对对象加锁，避免其他进程再将其获取。在进程使用完这个对象之后，还需要显式地将对象从内存中删除，并且释放对对象的加锁
 * @Date 2021/5/5 9:52
 * @Created by CuiJQ
 */
public class IdGenerator6 {

  private AtomicLong id = new AtomicLong(0);
  private static IdGenerator6 instance;
  private static SharedObjectStorage storage = new FileSharedObjectStorage(/*入参省略，比如文件地址*/);
  private static DistributedLock lock = new DistributedLock();

  private IdGenerator6() {
  }

  public synchronized static IdGenerator6 getInstance() {
    if (instance == null) {
      lock.lock();
      instance = storage.load(IdGenerator6.class);
    }
    return instance;
  }

  public synchronized void freeInstance() {
    storage.save(this, IdGenerator6.class);
    instance = null;
    //释放对象
    lock.unlock();
  }

  public long getId() {
    return id.incrementAndGet();
  }


}

